package controller.gui.informationpanel;

import gui.Display;
import gui.StrataOverviewPanel;
import gui.TextPanel;

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;
import javax.swing.JViewport;

import controller.Controller;
import controller.NullStaticObjectException;

/**rappresenta il Controller che si occupa di pilotare la LowerCentralView disposta
 * sotto il Display. Il Controller rileva gli eventi del mouse sul display, quindi
 * pilota le label al di sotto di esso: in questo modo l'utente puo' sempre sapere 
 * dove il cursore si trova nella mappa.
 * Inoltre il controller si preoccupa di gestire la visualizzazione 
 * 
 * @author koldar
 * @version 1.2
 */
public final class MapInformationController extends Controller implements MouseMotionListener{

	private CurrentStratumNotifier currentStratumNotifier;
	private TotalStrataNotifier totalStrataNotifier;
	private JLabel xLabel;
	private JLabel yLabel;
	private Display display;
	
	public MapInformationController(StrataOverviewPanel panel,Display display,JLabel xlabel,JLabel ylabel){
		super();
		this.currentStratumNotifier=new CurrentStratumNotifier(panel);
		this.totalStrataNotifier=new TotalStrataNotifier(panel);
		this.xLabel=xlabel;
		this.yLabel=ylabel;
		this.display=display;
		this.display.addMouseMotionListener(this);
	}
	
	/**in caso in cui l'utente dragghi il mouse sul Display, il Controller pilota le label di sotto come
	 * se l'utente avesse semplicemente mosso il mouse normalmente
	 * 
	 */
	@Override
	public void mouseDragged(MouseEvent e) {
		this.mouseMoved(e);
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		try{
			int x=(e.getX()/Controller.getCurrentmap().getMapresolution())+1;
			int y=(e.getY()/Controller.getCurrentmap().getMapresolution())+1;
			this.xLabel.setText("  x = "+(x<=this.display.getMap().getWidth()?x:"out of map"));
			this.yLabel.setText("  y = "+(y<=this.display.getMap().getHeight()?y:"out of map"));
		}catch (NullPointerException error){//in caso la mappa non sia stata ancora cablata oppure non può essere disegnata (poiché troppo grossa)
			this.xLabel.setText("not defined");
			this.yLabel.setText("not defined");
		}
	}


}
